package com.proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 创造代理类的工厂 ，拿到目标对象，通过反射，造出一个代理对象
 */
public class ProxyFactory {

    //目标对象
    private Object target ;
    //构造
    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 通过Proxy.newProxyInstance的给为目标对象生成代理对象
     * Proxy.newProxyInstance(loader  , interface , handler)
     *      loader : 当前目标对象使用的类加载器，获取加载器的方法固定
     *      interface : 目标对象实现的接口类型，使用泛型的方法确定类型
     *      InvocationHandler : 事件处理，执行目标方法时，会触发时间处理器
     *          会把当前执行的目标方法，作为参数传入
     */
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                //如何执行目标方法 执行每个方法应该都会进入到个handler中 ,  method 当前执行的方法对象 ，args当前执行的方法的参数
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("jdk代理开始 ~ ");
                        //通过反射执行目标对象的方法，参数是args returnValue执行方法的返回值
                        Object returnValue = method.invoke(target, args);
                        return returnValue;
                    }
                });
    }

}
